import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

public class Test {
        public static void main(String[] args) throws InterruptedException, IOException {
//        test1();// 获取title和url
//        test2();// 输入内容，搜索并校验搜索结果是否正确，隐式等待
//        test3();// 清空输入框并重新输入内容
//        test4();// 判断元素是否可以被点击，显示等待
//        test5();// 浏览器操作，前进、后退、刷新、滚动、全屏、设置大小
//        test6();// 键盘按键操作
//        test7();// 鼠标操作

//        test8();// 单选复选框操作
//        test9();// 多层级结构处理
//        test10();// 下拉列表操作
//        test11();// 弹窗操作
//        test12();// 打开文件操作
//        test13();// 关闭浏览器操作
//        test14();// 界面切换
            test15();// 截图操作
    }

    private static void test15() throws InterruptedException, IOException {
        // 打开浏览器
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        // 浏览器前进，搜索内容软件测试
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);

        // 进行截图
        File screenshotAs = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(screenshotAs, new File("D://zheshiyigejietu.png"));
    }

    private static void test14() throws InterruptedException {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("https://www.baidu.com");
        // 打开一个界面
        webdriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        // 界面切换
        // getWindowHandle是获取get的那个界面
        System.out.println(webdriver.getWindowHandle());
        Set<String> windowHandles = webdriver.getWindowHandles();
        String window_handle = "";
        for(String string : windowHandles){
            window_handle = string;
        }
        webdriver.switchTo().window(window_handle);
        sleep(3000);
        // 直接搜索是找不到元素的，因为默认是在get的界面进行操作,要进行上面的界面切换操作
        webdriver.findElement(By.cssSelector("#ww")).sendKeys("520");
        webdriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }

    private static void test13() throws InterruptedException {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("https://www.baidu.com");
        // 打开一个界面
        webdriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        // 关闭浏览器
        //webdriver.close();// get那个界面就close那个界面，不会清除缓存
        webdriver.quit();// 直接退出整个浏览器，会清除缓存
    }

    private static void test12() {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("file:///D:/Javacode/test/src/main/Page/test05.html");
        // 选择要上传的文件
        webdriver.findElement(By.cssSelector("body > input[type=file]")).sendKeys("D:\\图片\\信息");
    }

    private static void test11() throws InterruptedException {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("file:///D:/Javacode/test/src/main/Page/test04.html");
        // 选择按钮
        webdriver.findElement(By.cssSelector("body > button")).click();
        sleep(1000);
        // 点击弹窗的取消按钮
        webdriver.switchTo().alert().dismiss();
        sleep(1000);
        webdriver.findElement(By.cssSelector("body > button")).click();
        sleep(1000);
        // 点击弹窗的取消按钮
        webdriver.switchTo().alert().sendKeys("我成功的输入了内容");
        sleep(1000);
        webdriver.switchTo().alert().accept();
    }

    private static void test10() {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("file:///D:/Javacode/test/src/main/Page/test03.html");
        // 选择下拉按钮
        WebElement element = webdriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(element);
        //select.selectByIndex(3);
        select.selectByValue("8.34");
    }

    private static void test9() {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("D:/Javacode/test/src/main/Page/test02.html");
        // 选择点击按钮
        webdriver.switchTo().frame("f1");
        // 直接下面这样找不到对应的元素，因为这个页面是多层级结构，要加上上面这个语句进行指定
        webdriver.findElement(By.cssSelector("body > div > div > a")).click();
    }

    private static void test8() {
        // 打开浏览器界面
        WebDriver webdriver = new ChromeDriver();
        webdriver.get("D:/Javacode/test/src/main/Page/test01.html");
        // 智能等待
        webdriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        // 选择复选框并全选，选择单选框
        List<WebElement> input = webdriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < input.size(); i++) {
            // 如果是复选框，则选中，如果不是则不操作
            if (input.get(i).getAttribute("type").equals("checkbox"))
                input.get(i).click();
        }
    }

    private static void test7() throws InterruptedException {
        // 打开浏览器
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        // 浏览器前进，搜索内容软件测试
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(1000);

        // 找到图片按钮位置
        WebElement element = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        // 鼠标右击
        Actions action = new Actions(webDriver);
        // 需要加上perform来执行
        action.moveToElement(element).contextClick().perform();
    }

    private static void test6() throws InterruptedException {
        // 打开浏览器
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        // 浏览器前进，搜索内容软件测试
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();

        // Ctrl + A
        sleep(1000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        // Ctrl + X
        sleep(1000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        // Ctrl + V
        sleep(1000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
    }

    private static void test5() throws InterruptedException {
        // 打开浏览器
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        // 浏览器前进，搜索内容软件测试
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        // 强制等待三秒
        sleep(1000);
        // 浏览器后退
        webDriver.navigate().back();
        // 强制等待三秒
        sleep(1000);
        // 浏览器刷新
        webDriver.navigate().refresh();
        // 浏览器前进
        sleep(1000);
        webDriver.navigate().forward();

        // 浏览器滚动条划到最底端
        sleep(1000);
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        // 浏览器最大化
        sleep(1000);
        webDriver.manage().window().maximize();
        // 浏览器全屏
        sleep(1000);
        webDriver.manage().window().fullscreen();
        // 自定义大小
        sleep(1000);
        webDriver.manage().window().setSize(new Dimension(400,1000));
    }

    private static void test4() {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 智能等待中的显示等待，如果符合对应条件则直接向下执行，如果不符合则等待对应时长
        WebDriverWait wait = new WebDriverWait(webDriver, 1000);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer")));
        wait.until(ExpectedConditions.titleIs("百度一下，你就知道"));

    }

    private static void test3() {
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 找到百度搜索输入框（类选择器）
        // WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        // 使用xPath
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        // 输入搜索内容
        element.sendKeys("软件测试");
        // 找到百度一下按钮并点击
        webDriver.findElement(By.cssSelector("#su")).click();

        // 清空搜索框并输入新的内容
        element.clear();
        element.sendKeys("前端");
        // 点击百度一下
        webDriver.findElement(By.cssSelector("#su")).click();
    }

    private static void test2() {
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 找到百度搜索输入框（类选择器）
        // WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        // 使用xPath
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        // 输入搜索内容
        element.sendKeys("软件测试");
        // 找到百度一下按钮并点击
        webDriver.findElement(By.cssSelector("#su")).click();
        // submit和click区别在于，submit需要元素在form标签中才能使用
        // webDriver.findElement(By.cssSelector("#su")).submit();
        String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        System.out.println(button_value);
        // sleep(3000); // 强制等待
        // 智能等待,中的隐式等待如果在时间范围内获取到页面上的所有信息就停止等待，如果没有，则轮询等待，直到超出时间
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        // 校验出来的内容是否符合预期
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        System.out.println(elements.size());
        for (int i = 0; i < elements.size(); i++) {
            if(!elements.get(i).getText().contains("软件") && !elements.get(i).getText().contains("测试")) {
                System.out.println(elements.get(i).getText() + "失败");
                break;
            }
            else if(i == elements.size()-1)
                System.out.println("成功");
        }

        // 清空搜索框并输入新的内容
        element.clear();
        element.sendKeys("前端");
        // 点击百度一下
        webDriver.findElement(By.cssSelector("#su")).click();
    }

    private static void test1() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 验证title和url是否符合预期
        String title = webDriver.getTitle();
        String url = webDriver.getCurrentUrl();
        if (title.equals("百度一下，你就知道") && url.equals("https://www.baidu.com/")) {
            System.out.println("测试成功");
        }
        else {
            System.out.println(title + url + "测试失败");
        }
    }
}
